#include "stm32f10x.h"                  // Device header

/*
* https://blog.csdn.net/2301_80262474/article/details/140435991?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7ECtr-2-140435991-blog-79843806.235%5Ev43%5Epc_blog_bottom_relevance_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7ECtr-2-140435991-blog-79843806.235%5Ev43%5Epc_blog_bottom_relevance_base3 
*/

#ifdef __cplusplus
extern "C"
{
#endif

/**
*	@brief 微秒级延时
*	@param xus 延时时长，范围:0~233015 (重载计数器为24位(0xFFFFFF = 16777215) 16777215/72 = 233016.875,所以计数范围为0~233015)
*	@retval 无
*/
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;								//设置定时器重装值（MCU内部时钟为72MHZ，因此72个tick为1us）
	SysTick->VAL = 0x00;									//清空当前计数值
	SysTick->CTRL |= ((1 << 2) | (1 << 0));					//设置时钟源为HCLK（内部时钟），启动定时器(bit2:1, bit0:1)
	uint32_t nTemp = 0;
	do
	{
		nTemp = SysTick->CTRL;
		}while((nTemp & 0x01) && !(nTemp & (1 << 16)));			//等待计数到0（计数寄存器 (VAL)减到0时控制寄存器 (CTRL)的COUNTFLAG位（第16位）会置一个标志位，当标志位为1时，控制寄存器停止计数）
	SysTick->CTRL |= ~(1 << 0);								//关闭定时器
	SysTick->VAL = 0x00;									//清空当前计数值
}

/**
*	@brief 毫秒级延时
*	@param xms 延时时长，范围:0~4294967295
*	@retval 无
*/
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);										//循环调用微秒延时函数
	}
}

/**
*	@brief 秒级延时
*	@param xs 延时时长，范围:0~4294967295
*	@retval 无
*/
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);										//循环调用毫秒延时函数
	}
}


#ifdef __cplusplus
}
#endif
